package ar.com.PanteraRosa.Business;

import java.util.HashMap;
import java.util.Iterator;

import org.json.JSONException;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.util.Pair;
import ar.com.PanteraRosa.Entity.Contact;
import ar.com.PanteraRosa.Entity.User;
import ar.com.PanteraRosa.Model.ContactDao;
import ar.com.PanteraRosa.Model.ContactWebService;

/**
 * 
 * @desc maneja el modelo de datos de un Contact tanto Cloud como Mobile
 * @date 01/03/2012
 * @author pantera
 *
 */
public class ContactController {

    public Contact contact;
    private ContactDao contactDao;
    private ContactWebService contactWebService;
    private String jsonDataContactJoinUser;
    

    /**
     * 
     * @param ctx tiene que ser la activity que lo instancia
     */
    public ContactController(Context ctx) {
    	this.contact = new Contact();
    	this.contactDao = new ContactDao(ctx);
    	this.contactWebService = new ContactWebService();
    }
    

    /**
     * actualiza la bd de Contacts del Mobile tomando como referencia la bd de la web
     * @throws JSONException
     */
    public void updateContactsOnMobile(String strUserIdPadre) throws JSONException {
    	this.contactDao.open();
    	jsonDataContactJoinUser = contactWebService.getContacts(strUserIdPadre);
    	HashMap<Integer, Contact> tablaIdContact = contactWebService.parseJSONdata(jsonDataContactJoinUser);

    	Iterator<Integer> it = tablaIdContact.keySet().iterator();
		while (it.hasNext()) 
		{ 
		    Integer key = (Integer) it.next();
		    Pair<Integer, Contact> parIdContact = Pair.create(key, tablaIdContact.get(key));
		    insertContactOnMobile(parIdContact);
		    //TODO Falta actualizar la informacion de esos contactos en el mobile
		}
		this.contactDao.cerrar();
    }
    

    /**
     * inserta el dato traido por el Hash a la bd del celular
     * @param parIdUserPadre par de id de usuario y contacto de tipo contact
     */
    public void insertContactOnMobile(Pair<Integer, Contact> parIdContact) {
	
    	this.contactDao.crear(parIdContact.second.getContactID(), parIdContact.second.getUserIDPadre(), 
		parIdContact.second.getUserID());
    }
    
    
    /**
     * elimina el contact de id rowPadreId y devuelve true si es que lo encuentra
     * sino false
     * @param rowPadreId 
     * @param rowId
     * @return resultado de operacion true si lo elimna si no false .
     */
    public boolean deleteContactOnMobile(long rowPadreId, long rowId) {
    	return this.contactDao.eliminar(rowPadreId, rowId);
    }
    
    
    /**
     * devuelve todos los contactos en la bd del Mobile 
     * @return Cursor over all contacts
     * @throws SQLException
     */
    public Cursor loadAllUsersOnMobile(){
    	this.contactDao.open();
    	Cursor rdo = this.contactDao.cargarTodos();    
    	contactDao.cerrar();
    	return rdo;
    }
    
    
    /**
     * Busca en la bd del Mobile el contact de UserPadreId rowId
     * @param rowIdPadre id de usuario a buscar contactos en la bd del Mobile
     * @return si encontro rowIdPAdre puntero al Contacto encontrado sino SQLException
     * @throws SQLException
     */
    public Cursor loadContactsByIdUserOnMobile(long rowIdPadre) throws SQLException {    
		this.contactDao.open();
		Cursor rdo = this.contactDao.cargarPorId(rowIdPadre);    
		contactDao.cerrar();
		return rdo;
    }
    
        
    /**
     * TODO validar params (cosa q el contacto sea valido) y cambiar el return siempre true 
     * @param contact
     * @return
     */
    public boolean insertContactOnCloud(Contact contact){
		String strContact;
		String params = "UserIdPadre="+contact.getUserIDPadre()+
				"&UserId="+contact.getUserID();
				
		//str con parametros usados
		strContact = params;
		
		//prueba harcodeada
		//strContact = "UserFirstName=jason2&UserLastName=jason3&UserPassword=jason4&UserEmail=jason5&UserNick=jason1";
		
		this.contactWebService.insertContact(strContact);	
		return true;
    }
    
    
    /**
     * TODO 
     * @param user
     * @return
     */
    public boolean updateUserOnCloud(User user){
    
    	return true;
    }    
    
    /**
     * TODO
     * @param rowId
     * @return
     */
    public boolean deleteUserOnCloud(long rowId){
    	return true;
    }


    /**
     * @return the jsonDataContactJoinUser
     */
    public String getJsonDataContactJoinUser() {
        return jsonDataContactJoinUser;
    }    
    

}
